package com.pan.structual.flyweight;

import com.pan.structual.flyweight.factory.StringPictureFactory;
import com.pan.structual.flyweight.utils.MyFrameUtils;

import java.awt.*;

/**
 * 享元模式
 *
 * 享元模式，是一种结构型设计模式，旨在通过共享来减少内存使用和计算开销。
 *
 * 优点：
 *
 * 内存效率：享元模式通过共享相似对象，减少了大量相同或相似对象的内存分配，从而降低了内存消耗。
 * 性能提升：避免了大量对象的创建和销毁，减少了垃圾回收器的工作压力，提高了程序的吞吐量。
 * 降低耦合度：内部状态（共享）与外部状态（特定于上下文）的分离，降低了对象间的耦合度，使得对象更容易管理和复用。
 * 线程安全：共享对象可以在多线程环境中安全地并发访问，不会引起线程安全问题。
 * 缺点：
 *
 * 实现复杂性：需要对内部状态和外部状态进行区分，这在实际开发中可能会增加实现的复杂性。
 * 过度共享风险：如果内部和外部状态没有合理设计，可能会导致系统过度共享，从而影响系统的性能和正确性。
 * 代码复杂度增加：为了实现享元模式，可能需要对系统进行全面分析和重构，这可能会增加系统的开发时间和成本。
 * 适用范围限制：如果对象的状态不能有效地分为内部和外部状态，或者内部状态非常复杂，享元模式可能不会提供帮助。
 * 总的来说，享元模式适用于那些需要大量相似对象的场合，尤其是当对象的大部分状态可以共享时。在实现时，应当注意合理划分对象的内部状态和外部状态，以确保模式的正确性和高效性。
 *
 */

public class FlyweightApplication {
    public static void main(String[] args) {
        StringPictureFactory stringPictureFactory = new StringPictureFactory();

        System.out.println("打印第一段字符串");
        String text = "114514";// 114514 1919810
        Image strImage = stringPictureFactory.getStrImage(text);
        MyFrameUtils.INSTANCE.show(strImage);


        System.out.println("打印第二段字符串");
        String text2 = "1919810";// 114514 1919810
        Image strImage2 = stringPictureFactory.getStrImage(text2);
        MyFrameUtils.INSTANCE.show(strImage2);

        System.out.println("打印第三段字符串");
        String text3 = "114514 1919810";// 114514 1919810
        Image strImage3 = stringPictureFactory.getStrImage(text3);
        MyFrameUtils.INSTANCE.show(strImage3);

        System.out.println("打印第三段字符串");
        String text4 = "8848";// 114514 1919810
        Image strImage4 = stringPictureFactory.getStrImage(text4);
        MyFrameUtils.INSTANCE.show(strImage4);

    }
}
